<?php
/*
 *  $Id: Mysql.php 7490 2010-03-29 19:53:27Z jwage $
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software consists of voluntary contributions made by many individuals
 * and is licensed under the LGPL. For more information, see
 * <http://www.doctrine-project.org>.
 */

/**
 * Doctrine_Expression_Mysql
 *
 * @package     Doctrine
 * @subpackage  Expression
 * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @link        www.doctrine-project.org
 * @since       1.0
 * @version     $Revision: 7490 $
 * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
 */
class Doctrine_Expression_Mysql extends Doctrine_Expression_Driver
{
	/**
	 * returns the regular expression operator
	 *
	 * @return string
	 */
	public function regexp()
	{
		return 'RLIKE';
	}

	/**
	 * return string to call a function to get random value inside an SQL statement
	 *
	 * @return string to generate float between 0 and 1
	 */
	public function random()
	{
		return 'RAND()';
	}

	/**
	 * build a pattern matching string
	 *
	 * EXPERIMENTAL
	 *
	 * WARNING: this function is experimental and may change signature at
	 * any time until labelled as non-experimental
	 *
	 * @access public
	 *
	 * @param array $pattern even keys are strings, odd are patterns (% and _)
	 * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
	 * @param string $field optional field name that is being matched against
	 *                  (might be required when emulating ILIKE)
	 *
	 * @return string SQL pattern
	 */
	public function matchPattern($pattern, $operator = null, $field = null)
	{
		$match = '';
		if ( ! is_null($operator)) {
			$field = is_null($field) ? '' : $field.' ';
			$operator = strtoupper($operator);
			switch ($operator) {
				// case insensitive
				case 'ILIKE':
					$match = $field.'LIKE ';
					break;
					// case sensitive
				case 'LIKE':
					$match = $field.'LIKE BINARY ';
					break;
				default:
					throw new Doctrine_Expression_Mysql_Exception('not a supported operator type:'. $operator);
			}
		}
		$match.= "'";
		foreach ($pattern as $key => $value) {
			if ($key % 2) {
				$match .= $value;
			} else {
				$match .= $this->conn->escapePattern($this->conn->escape($value));
			}
		}
		$match.= "'";
		$match.= $this->patternEscapeString();
		return $match;
	}

	/**
	 * Returns global unique identifier
	 *
	 * @return string to get global unique identifier
	 */
	public function guid()
	{
		return 'UUID()';
	}

	/**
	 * Returns the year from dbms
	 *
	 * @param string $column
	 * @return string to get year from dbms
	 */
	public function year($column)
	{
		$column = $this->getIdentifier($column);
		return 'YEAR(' .  $column . ')';
	}

	/**
	 * Returns the month from dbms
	 *
	 * @param string $column
	 * @return string to get month from dbms
	 */
	public function month($column)
	{
		$column = $this->getIdentifier($column);
		return 'MONTH(' .  $column . ')';
	}

	/**
	 * Returns day from dbms
	 *
	 * @param string $column
	 * @return string to get day from dbms
	 */
	public function day($column)
	{
		$column = $this->getIdentifier($column);
		return 'DAY(' .  $column . ')';
	}

	/**
	 * Returns soundex from dbms
	 *
	 * @param string $column
	 * @return string to get soundex from dbms
	 */
	public function soundex($column)
	{
		return 'SOUNDEX(' . $column . ')';
	}
}